#include "STC15Wxx.h" //自定义头文件,<>系统头文件
#include"ABSACC.H"
#include"INTRINS.H"

#define FOSC 11059200L
#define T1MS (65536-FOSC/1000)      //1T模式

void System_Init(void);
void OOKDataSent(unsigned char SentDat);
void Hard_Pro(void);
void SystmPro(void);
void Sleep_Pro(void);

sbit INT1 = 0xB3;
sbit INT0 = 0xB2;

#define LED_WORK_STA P30   //宏定义  名称   内部存储  // sbit P31=P3^1; sbit P30 =P3^0;
#define YELLOW_BAT P31
#define BAT_LOW P33

#define STA_DOOR_OPEN P35
#define STA_DOOR_CLOSE P34

#define OOK_DAT_OUT P32
unsigned char flag_Door;//=0无动作  1关门  2开门
unsigned char DoorSta;//=0无动作  1关门  2开门
unsigned char flag_VlotLow;//=0 电池未低压    =1 电池低压   =2 电池低压中


// 12.8毫秒 TH0 TL0 的数据   寄存器计数  =  （12.8毫秒 * 1000）/ A = 5899      TH0 TL0 =  65535- 5899 = 59636   E8F4

// 0.4毫秒  TH0 TL0 的数据    寄存器计数  =  （0.4毫秒 * 1000）/ A = 184         TH0 TL0 =  65535- 184 = 65351     FF47
// 1.2毫秒  TH0 TL0 的数据                           （1.2毫秒 *1000） /A = 553      TH0 TL0 =   65535- 553 = 64982       FDD6
#define OOK_TONG_H 0xE8
#define OOK_TONG_L 0XF4

#define OOk_SMALL_H 0xFF
#define OOK_SMALL_L 0x47

#define OOK_LONG_H 0xFD
#define OOK_LONG_L 0xD6

unsigned char coding[100];


void OOKDataSent(unsigned char SentDat)
{
    unsigned char i,j,dat;
    unsigned char data2,data1,data0;
    data2=CBYTE[0xFF8];
    data1=CBYTE[0xFF7];
    data0=CBYTE[0xFF6];
    

    //将OOK 数据中的功能码添加到发射数据中
    data0 &=0xF0;
    SentDat &=0x0F;
    data0 |=SentDat;

    //同步信号
    //0.4ms 高电平
    coding[0]=OOk_SMALL_H;
    coding[1]=OOK_SMALL_L;
    //12.8ms 低电平
    coding[2]=OOK_TONG_H;
    coding[3]=OOK_TONG_L;

    for(i=4;i<100;i++)
    {
        if(i=4)
        {
            dat=data2;
        }
        else if(i==36)
        {
            dat=data1;
        }
        else if(i==68)
        {
            dat=data0;
        }
        dat=data2;
        for(j=0;j<8;j++)
        {
            if(dat & 0x80)
            {
            //0.4ms 高电平
            coding[i]=OOk_SMALL_H;
            i++;
            coding[i]=OOK_SMALL_L;
            i++;
            //12.8ms 低电平
            coding[i]=OOK_LONG_H;
            i++;
            coding[i]=OOK_LONG_L;
            //i++;
            }
            else
            {
            //12.8ms 高电平
            coding[i]=OOK_LONG_H;
            i++;
            coding[i]=OOK_LONG_L;
            i++;
            //0.4ms 低电平
            coding[i]=OOk_SMALL_H;
            i++;
            coding[i]=OOK_SMALL_L;
            //i++;
            } 
            dat<<=1;
            //87654321
        }
    }

    // if(data2 & 0x80)//1000 0000
    // {
    // //0.4ms 高电平
    // coding[4]=OOk_SMALL_H;
    // coding[5]=OOK_SMALL_L;
    // //12.8ms 低电平
    // coding[6]=OOK_LONG_H;
    // coding[7]=OOK_LONG_L;

    // }
    // else
    // {
    // //12.8ms 低电平
    // coding[4]=OOK_LONG_H;
    // coding[5]=OOK_LONG_L;
    // //0.4ms 高电平
    // coding[6]=OOk_SMALL_H;
    // coding[7]=OOK_SMALL_L;
    // }

    // if(data2 & 0x40)//0100 0000
    // {
    // //0.4ms 高电平
    // coding[8]=OOk_SMALL_H;
    // coding[9]=OOK_SMALL_L;
    // //12.8ms 低电平
    // coding[10]=OOK_LONG_H;
    // coding[11]=OOK_LONG_L;
    // }
    // else
    // {
    // //12.8ms 低电平
    // coding[8]=OOK_LONG_H;
    // coding[9]=OOK_LONG_L;
    // //0.4ms 高电平
    // coding[10]=OOk_SMALL_H;
    // coding[11]=OOK_SMALL_L;
    // }

    TR0 = 1;        //定时器0开始计时   打开
    ET0 = 0;        //使能定时器0中断   关闭掉了


    OOK_DAT_OUT=1;
    for(j=0;j<10;j++)//发射数据的帧数
    {
        //一帧数据
        for(i=0;i<100;i++)
        {
            TF0=0;
            TH0=coding[i];
            TL0=coding[i];
            //OOK_DAT_OUT=!OOK_DAT_OUT;
            if(OOK_DAT_OUT)
                OOK_DAT_OUT=0;
            else
                OOK_DAT_OUT=1;
            while(!TF0)
            {

            }
            TF0=0;
        }
    }
    
    TF0=0;
    TR0=0;
    OOK_DAT_OUT=0;
}


void Delay10ms()		//@5.5296MHz  延时10ms
{
	unsigned char i, j;

	i = 54;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}

void Delay100ms()		//@5.5296MHz  延迟100ms
{
	unsigned char i, j, k;
	i = 3;
	j = 26;
	k = 223;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void Delay3000ms()		//@5.5296MHz
{
	unsigned char i, j, k;

	// _nop_();
	// _nop_();
	i = 64;
	j = 9;
	k = 179;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


//主程序
void main()
{
    System_Init();
    while(1)
    {
        Hard_Pro();//硬件检测
        SystmPro();//LED灯亮 OOK 数据发送
        Sleep_Pro();//省电模式
        
    }
}

void Sleep_Pro(void)
{
    PCON = 0x02;            //MCU进入掉电模式
    _nop_();                //掉电模式被唤醒后,首先执行此语句,然后再进入中断服务程序
    _nop_();
}

void Hard_Pro(void)
{
    if(flag_Door==1)
            {
                //门关闭
                flag_Door=0;
                Delay10ms();
                if(STA_DOOR_CLOSE==0)
                {
                    //门关闭了
                    DoorSta=1;
                }
            }
        else if(flag_Door==2)
            {
                //门打开
                flag_Door=0;
                Delay10ms();
                if(STA_DOOR_OPEN==0)
                {
                    //门打开了
                    DoorSta=2;
                }
            }
        else
            {
                flag_Door=0;
            }
        if(flag_VlotLow)
        {
            if(flag_VlotLow==1)
            {
                Delay10ms();
                if(BAT_LOW ==0)
                {
                    flag_VlotLow=2;
                    OOKDataSent(6);
                }
                else
                {
                    flag_VlotLow=0;
                }

            }
        }
}


void SystmPro(void)
{
     if(DoorSta)
        {
            LED_WORK_STA=1;//工作状态灯打开
            Delay100ms();
            //主机要求 开门发射数据4 关门5
            if(DoorSta==1)
            {
                 OOKDataSent(5);
            }
            else //if(DoorSta==2)
            {
                OOKDataSent(4);
            }
            LED_WORK_STA=0;//工作状态灯关闭
            DoorSta=0;
        }
        if(flag_VlotLow)
        {
            //电池低压提示
            YELLOW_BAT=1;//工作状态灯打开
            Delay100ms();
            YELLOW_BAT=0;//工作状态灯关闭
        }
}

void System_Init()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
    P6M0 = 0x00;
    P6M1 = 0x00;
    P7M0 = 0x00;
    P7M1 = 0x00;

    OOK_DAT_OUT=0;

    //LED灯IO  IO口推挽输出，强上拉输出
    // P3M1 &= (~0x03);  
    // P3M0 |= 0x03;


    //INT0 初始化
    //INT0 = 1;
    IT0 = 1;                    //设置INT0的中断类型 (1:仅下降沿 0:上升沿和下降沿)
    EX0 = 1;                    //使能INT0中断
    EA = 1;


    //p3.4 p3.5 开漏
    P3M0 |=0x30;
    P3M1 |=0x30;
    //LED灯关闭   初始化
    LED_WORK_STA=0;
    YELLOW_BAT=0;

    //INT1 初始化
    INT1 = 1;
    IT1 = 1;                    //设置INT1的中断类型 (1:仅下降沿 0:上升沿和下降沿)
    EX1 = 1;                    //使能INT1中断
    EA = 1;


    //INT2 中断IO
    INT_CLKO |= 0x10;               //(EX2 = 1)使能INT2中断
    //INT3 中断IO
    INT_CLKO |= 0x20;               //(EX3 = 1)使能INT3中断
    EA = 1;


    AUXR |= 0x80;                   //定时器0为1T模式
//  AUXR &= 0x7f;                   //定时器0为12T模式

    TMOD = 0x00;                    //设置定时器为模式0(16位自动重装载)
    //TL0 = T1MS;                     //初始化计时值
    //TH0 = T1MS >> 8;
    TR0 = 0;                        //定时器0开始计时   关闭掉了
    ET0 = 0;                        //使能定时器0中断   关闭掉了
    EA = 1;

    LED_WORK_STA=1;//开机 蓝灯 黄灯 长亮3秒
    YELLOW_BAT=1;
    Delay3000ms();
    LED_WORK_STA=0;
    YELLOW_BAT=0;

    flag_Door=0;//门状态初始化
    DoorSta=0;
    flag_VlotLow=0;

    
}



/* Timer0 interrupt routine */
void tm0_isr() interrupt 1
{
    //P10 = ! P10;                    //将测试口取反
}

//中断服务程序
void exint0() interrupt 0       //INT0中断入口
{
    //P10 = !P10;                 //将测试口取反
}


//中断服务程序
void exint1() interrupt 2       //INT1中断入口
{
    flag_VlotLow=1;
    //P10 = !P10;                 //将测试口取反
}


//中断服务程序   开门检测
void exint3() interrupt 11          //INT3中断入口
{
   flag_Door=2; 
}


//中断服务程序  关门检测
void exint2() interrupt 10          //INT2中断入口
{
    flag_Door=1;
}

